{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第二周作业"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 作业1 \n",
    "画图解释图像卷积滤波的基本原理，并进一步简述常见的图像平滑滤波算法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 图像卷积滤波的基本原理\n",
    "数字处理中滤波处理的是一维信号，图像的滤波实际上就是把信号的滤波做了二维的扩展，由一维的时间信号转变成了二维的图像矩阵。图像的滤波由卷积来定义。\n",
    "![pic](homework_pic/1.png)\n",
    "原始的图像f通过一个滤波器滤波，等同于原始的图像f与这个滤波器进行卷积，图像的卷积由数字化的形式决定。\n",
    "通常我们日常所用的滤波器为对称滤波器，卷积需要先对滤波矩阵进行180的翻转，但如果矩阵是对称的，那么两者就没有什么差别了。在图像中常以模板的形式进行定义和加权平均。\n",
    "![pic](homework_pic/2.png)\n",
    "此时的二维滤波器矩阵，我们称之为卷积核。\n",
    "\n",
    "图像滤波卷积的计算：\n",
    "![pic](homework_pic/3.png)\n",
    "矩阵中的元素就是图像的每一个像素点，也就是把原始图像和对应滤波器中对应元素两两相乘，所有像素对应相乘后全部加起来，得到一个和，其位置和滤波器的中心位置相同，这样就完成了卷积的过程，将卷积核不断的从左到右从上到下移动，与对应的原始图片元素进行卷积，最后就得到了完整的滤波结果。\n",
    "由于卷积之后只能得到一个值，所以卷积之后的图像一定会比原来的图像小，缩小的比例是由滤波器大小决定的，把滤波器大小的一半称作为滤波的半径，比如3* 3的滤波器其半径为1，图像经过这样的滤波器之后，其结果的半径就比原图像小1，原本5* 5的图像经过滤波卷积之后得到的图像就是3* 3的图像"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 常见的图像平滑滤波算法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "图像的平滑滤波就相当于一维中对于信号的平滑处理，扩展到二维中进行的图像平滑。\n",
    "噪声是图片中灰度值突变的像素点，图像平滑就可以相应的消除或者减弱图像的噪声。\n",
    "\n",
    " - 平均滤波（平滑均值滤波）\n",
    "在小范围内，对像素值进行平均，取平均值代替中间像素值，所以起到的平滑的效果：\n",
    "- - 在小区域内（通常3* 3）像素值平均：\n",
    "![pic](homework_pic/4.png)\n",
    "而为了保证经过滤波之后图像的能量和原来的一样，所以要乘上一个权值系数。\n",
    "滤波器常见的几种，小区域取十字区域（具有5个像素）、小区域取环形区域、取3* 3的滤波器：\n",
    "![pic](homework_pic/5.png)\n",
    "其中取十字区域和取3* 3的滤波器在取完中心点之后，周边的点不同，取3* 3的滤波器中，不仅上下左右是相邻像素，斜角也定义为相邻像素。这种定义不同会导致窗口选择的不同，通常把取十字区域叫做四邻域，而取3* 3的滤波器我们叫做8邻域。\n",
    "\n",
    " - 加权平均滤波\n",
    " 再一个小区域内（通常是3* 3）像素值加权平均：\n",
    " ![pic](homework_pic/6.png)\n",
    " 加权平均是图像中心点为重，离中心位置越近越重要。\n",
    " 常见两种选取方式，右边的叫做高斯平局滤波：\n",
    " ![pic](homework_pic/7.png)\n",
    " - 中值滤波\n",
    " - - 确定窗口及位置（含有奇数个像素）\n",
    " - - 窗口内像素灰度大小排序\n",
    " - - 取中间值代替窗口中心像素值\n",
    "![pic](homework_pic/8.png)\n",
    "![pic](homework_pic/9.png)\n",
    "常用的3* 3和5* 5滤波器：\n",
    "![pic](homework_pic/10.png)\n",
    "\n",
    "三种滤波器比较：\n",
    "平均滤波，虽然有去噪效果，但是会让图片变得模糊，所以实际应用过程中很少直接使用。\n",
    "高斯滤波，有效的去噪方法。\n",
    "中值滤波，人眼可能无法直接区分与高斯滤波效果的差别，但是中值滤波对椒盐噪声效果较好。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 作业2\n",
    "1. 简述边缘检测的基本原理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " - 基本思想  \n",
    "基于边缘检测的图像分割方法的基本思路是先确定图像中的边缘像素，然后再把这些像素连接在一起就构成所需的区域边界。首先对边缘做微分（差分），一阶微分还可以继续做一次微分。一般做一阶或者二阶的微分（差分信息）。边缘检测本质就是微分。实际上常用差分，分为x方向，y方向。  \n",
    "图像边缘：图像边缘，即表示图像中一个区域的终结和另一个区域的开始，图像中相邻区域之间的像素集合构成了图像的边缘。所以，图像边缘可以理解为图像灰度发生空间突变的像素的集合。图像边缘有两个要素，即：方向和幅度。沿着边缘走向的像素值变化比较平缓；而沿着垂直于边缘的走向，像素值则变化得比较大。因此，根据这一变化特点，通常会采用一阶和二阶导数来描述和检测边缘。  综上，图像中的边缘检测可以通过对灰度值求导数来确定，而导数可以通过微分算子计算来实现。在数字图像处理中，通常是利用差分计算来近似代替微分运算。\n",
    "![pic](homework_pic/11.png)\n",
    " - 基本算子\n",
    "Robert算子卷积核：\n",
    "![pic](homework_pic/12.png)\n",
    "![pic](homework_pic/13.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. Sobel、LoG和Canny算子的原理差异。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " - Sobel算子  \n",
    "日常使用最多的一种算子：\n",
    "![pic](homework_pic/14.png)\n",
    "![pic](homework_pic/15.png)\n",
    "\n",
    " - 拉普拉斯算子  \n",
    "![pic](homework_pic/16.png)\n",
    " - Log算子  \n",
    "先对图像做高斯滤波，然后再做拉普拉斯算子运算。  \n",
    "![pic](homework_pic/17.png)\n",
    "上述方法都是在原始图像上经过一个滤波模版进行卷积得到结果，虽然形式简单，但更容易受到噪声影响，而在求取边缘的时候，往往因为图像中的噪声或者边缘本身的模糊性，导致最后的边缘结果模糊不清楚或者边缘出现中断的情况。\n",
    " - Canny算子  \n",
    "解决已有方法问题，噪声、断裂、虚检（渐变灰度）。\n",
    "核心优点：边缘可自动联通。\n",
    "算法步骤：平滑图像同时计算微分；计算梯度（赋值和方向）；梯度赋值进行非极大值抑制；自动边缘连接\n",
    "![pic](homework_pic/18.png)\n",
    "![pic](homework_pic/19.png)\n",
    "![pic](homework_pic/20.png)\n",
    "![pic](homework_pic/21.png)\n",
    "![pic](homework_pic/22.png)\n",
    "Sobel边缘检测算法比较简单，实际应用中效率比canny边缘检测效率要高，但是边缘不如Canny检测的准确，但是很多实际应用的场合，sobel边缘却是首选，Sobel算子是高斯平滑与微分操作的结合体，所以其抗噪声能力很强，用途较多，尤其是效率要求较高，而对细纹理不太关心的时候。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 作业3\n",
    "简述图像直方图的基本概念，及使用大津算法进行图像分割的基本原理。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 图像直方图\n",
    "给定数字图像，对其进行像素格的分割，每个像素格就有一个具体的图像信息，对图像信息进行数学上的统计行程直方图，通常使用的是灰度直方图。直方图中具体的条柱其数值是从数据中计算出的特征统计量，这些数据可以是诸如梯度、方向、色彩或任何其他特征。图像的直方图可以通过算法来对图像进行按比例缩小，且具有图像平移、旋转、缩放不变性等众多优点。直方图在进行图像计算处理时代价较小，所以经常用于图像处理。  \n",
    "图像直方图（Image Histogram）是用以表示数字图像中亮度分布的直方图，标绘了图像中每个亮度值的像素数。这种直方图中，横坐标的左侧为纯黑、较暗的区域，而右侧为较亮、纯白的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分，而整体明亮、只有少量阴影的图像则相反。CV 领域常借助图像直方图来实现图像的二值化。  \n",
    "灰度直方图描述了图像中灰度值的分布情况。灰度直方图中对比度低的图像中，灰度值集中在某几个值上。 好的图片，高对比度图，其灰度直方图数值分布比较均匀平均。具体的灰度直方图以灰度为横坐标，取值为0-255。以这些灰度值出现的次数或者所占总的比例为纵坐标。 图像中波峰位置意味着对应的灰度值出现的最多，波谷则代表出现的灰度值较少。  \n",
    "当灰度直方图的纵坐标采用灰度值的数量占总的比例时，好处在于图中灰度的个数一定是像素的个数，其灰度直方图的积分一定为1，这种灰度直方图就等同于灰度出现的概率密度函数。  \n",
    "![pic](homework_pic/23.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 灰度阈值分割\n",
    "假如：图像中的目标区和背景区或者不同目标之间，存在不同的灰度或平均灰度。\n",
    "凡是灰度值包含于z的像素都变为某一灰度值，其他的变成另一个灰度值，则该图像就以z为界被分为两个区域。\n",
    "![pic](homework_pic/24.png)\n",
    "如果=1和=0，分割后的图像为二值分割。\n",
    "\n",
    "确定最佳阈值，使背景和目标很明显的区分开。\n",
    "\n",
    "#### 大津算法\n",
    "确定最佳阈值，使目标和背景之间的类间方差最大（因为二者差异最大）\n",
    "![pic](1.png)\n",
    "算法实现：遍历灰度值\n",
    "![pic](2.png)\n",
    "![pic](3.png)\n",
    "受噪声影响，并且当存在灰度渐变的时候就很难区分阈值。\n",
    "\n",
    "#### 区域生长法：\n",
    "从种子点开始，按照一定准则（如相邻像素灰度相似性）向周围扩散，将邻域相似像素加入区域中。\n",
    "步骤：\n",
    "1、对图像顺序扫描！找到第1个还没有归属的像素，设该像素为（x0，y0）；\n",
    "2、以（x0，y0）为中心，考虑（x0，y0）的8邻域像素（x，y），如果（x，y）满足生长准则，将（x，y）与（x0，y0）合并，同时将（x，y）压入堆栈；\n",
    "3、从堆栈中取出一个像素，把它当做（x0，y0）返回到步骤2；\n",
    "4、当堆栈为空时，返回到步骤1；\n",
    "5、重复步骤1、4直到图像中每个点都有归属时。生长结束。\n",
    "\n",
    "区域生长的两个方法：广度优先、深度优先。\n",
    "\n",
    "![pic](4.png)\n",
    "图片中右侧是使用区域生长算法得到的结果。相对于大津算法，区域生长算法得到了比较不错的结果。本质上，大津算法相当于全局阈值算法，因为取到的阈值针对整个图像来取，所以当图像中灰度值发生渐变或者目标光照复杂，结果往往不理想。区域生长算法是局部的方法，针对的是某个像素和相邻邻域的像素，考察的是邻域内的变化，所以图中虽然存在灰度值，但是由于在某个邻域中，每次比较的都是它的相邻像素，所以可以得到比较不错的结果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# OpenCV的代码实现\n",
    "# 计算灰度直方图\n",
    "dst=cv.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])\n",
    "\n",
    "# 大津算法计算阈值\n",
    "retval,dst=cv.threshold(src,thresh,maxval,type[,dst])\n",
    "\n",
    "# 漫水填充(区域生长法)\n",
    "retval,image,mask,rect=v.floodFill(image,mask,seedPoint,newVal[,loDiff[,upDiff[,flags]]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 总结\n",
    "1. 灰度直方图是图像中灰度分布统计图。\n",
    "2. 大津算法是最常用的一类灰度阈值自动选取方式，目标是令类间方差最大。\n",
    "3. 区域生长法是另一类有效的分割方法，其核心在于利用相邻像素间的相似性。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 作业4\n",
    "简述Harris算子对角点的定义，进行角点检测的基本原理，并说明引入角点响应函数的意义。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Harris算子对角点的定义\n",
    " - 在灰度变化平缓区域，窗口内像素灰度积分近似保持不变。\n",
    " - 在边缘区域，边缘方向：灰度积分近似不变，其余任意方向：剧烈变化。\n",
    " - 在角点处，任意方向均剧烈变化。\n",
    " \n",
    "![pic](7.png)\n",
    "![pic](8.png)\n",
    "![pic](9.png)\n",
    "![pic](10.png)\n",
    "![pic](11.png)\n",
    "使用角点响应函数来自动评判，减少阈值的设定的影响。\n",
    "![pic](12.png)\n",
    "\n",
    "\n",
    "##### OpenCV实现：\n",
    " - src，输入图像，即源图像，填Mat类的对象即可，且需为单通道8位或者浮点型图像。\n",
    " - dst，函数调用后的运算结果存在这里，即这个参数用于存放Harris角点检测的输出结果，和源图片有一样的尺寸和类型。\n",
    " - blockSize，表示邻域的大小，更多的详细信息在cornerEigenValsAndVecs中有讲到。\n",
    " - ksize，表示Sobel()算子的孔径大小。\n",
    " - k， Harris参数。\n",
    " - borderType，图像像素的边界模式，注意它有默认值BORDER_DEFAULT。更详细的解释，参考borderInterpolate函数。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dst =cv.cornerHarris(src,blockSize,ksize,k[,dst[,borderType]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 作业5\n",
    "简述Hough变换的基本原理(包括参数空间变换及参数空间划分网格统计)。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Hough变换的基本原理\n",
    "直线是非常重要的一种特征。\n",
    "采用参数空间变换的方法，对噪声和不间断直线的检测具有鲁棒性。  \n",
    "可用于检测圆和其他参数形状。  \n",
    "核心思想：直线 y=kx+b  \n",
    "可以标记为： xcos θ+ysin θ =ρ  \n",
    "每一条直线对应一个k，b，参数方程下对应一个点（ρ，θ）\n",
    "![pic](5.png)\n",
    "\n",
    "##### 参数空间变换\n",
    "直角坐标系的一点(x,y)，对应极坐标系下的一条正弦曲线ρ = x cos θ+y sin θ。  \n",
    "同一条直线上的多个点，在极坐标系下必相交于一点\n",
    "![pic](6.png)\n",
    "\n",
    "在实际情境中，我们无法判断多个点是否在一条直线上，我们就通过hough变换将多个点变换到极坐标系下对应多条曲线，这样假如多条曲线相交于一点，那么相应的就可以判断这个点对应的那条曲线就是直角坐标系下多个点的对应的同一条直线，而极坐标中零散曲线相交的点就不需要考虑了。\n",
    "\n",
    "##### 参数空间划分网格统计\n",
    " - 将（ρ，θ）空间量化成许多小格。\n",
    " - 根据x-y平面每一个直线点代入θ的量化值，算出各个ρ，将对应格计数累加。\n",
    " - 当全部点变换后，对小格进行检验。设置累计阈值T，计数器大于T的小格对应于共线点，其可以用作直线拟合参数。小于T的反映非共线点，丢弃不用。\n",
    " \n",
    "不用k，b而用ρ，θ是因为取值范围分别是0-无穷，0-2π。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# cpenCV实现\n",
    "# 标准Hough变换\n",
    "HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]]) \n",
    "# 累积概率Hough变换\n",
    "HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 作业6\n",
    "简述SIFT原理(重点是尺度空间和方向直方图原理)及ORB算子原理(重点是FAST和BRIEF)。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### SIFT原理\n",
    " - SIFT的全称是Scale Invariant Feature Transform（尺度不变特征发换），是由加拿大教授David G.Lowe在1999年在会议文章中提出， 2004年収表在IJCV上。\n",
    " - 是计算机视觉界近二十年来引用率最高的文章之一\n",
    " - SIFT特征对旋转、尺度缩放、亮度发化等保持丌发性，是一种稳定的局部特征\n",
    " - SIFT的特征提取方面对计算机视觉近年来的収展影响深远，特别是几乎影响到了后续所有的角点提取和匹配算法\n",
    " \n",
    "##### SIFT 算法特点\n",
    " - 图像的局部特征，对旋转、尺度缩放、亮度变化保持不变，对视角变化、仿射变换、噪声也保持一定程度的稳定。\n",
    " - SIFT变换提取出来的不仅是一个变换，也是个特征描述子，是个高维向量，独特性好，信息量丰富，适用于海量特征库进行快速、准确的匹配。\n",
    " - 多量性：即使是很少几个物体也可以产生大量的SIFT特征\n",
    " - 高速性：改进的SIFT匹配算法甚至可以达到实时性\n",
    " - 扩展性：可以也很方便的与其他的特征向量进行联合。\n",
    "\n",
    "##### 尺度空间\n",
    " - 人眼可自动调节尺度，完成对物体的检测和识别。\n",
    " - 模仿人的视觉认知，把物体不同尺度下的图像都提供给机器，让机器能够对物体在不同的尺度下综合信息识别。\n",
    " - 因此，首先需要建立尺度空间。\n",
    " - 通过高斯凼数不原图像卷积，并经过下采样，可建立原始图像的尺度空间模型。\n",
    " \n",
    "##### 二维高斯函数\n",
    "![pic](13.png)\n",
    "实际使用中，我们往往使用方型模版。其中高斯计算公式中σ代表正太分布的标准差，σ就意味着作用的范围越广\n",
    "![pic](14.png)\n",
    "\n",
    "![pic](15.png)\n",
    "对图像做扩展。\n",
    "![pic](16.png)\n",
    "0.6的时候，半径比较小，变化不大。\n",
    "选值为10的时候，因为没有对图像进行扩展，则会产生很多损失。\n",
    "![pic](17.png)\n",
    "\n",
    "##### 尺度空间理论\n",
    " - 在图像信息处理模型中引入一个被视为尺度的参数，通过连续变化尺度参数获得多尺度下的尺度空间表示序列，对这些序列进行尺度空间主轮廓的提取，并以该主轮廓作为一种特征向量，实现边缘、角点检测和不同分辨率上的特征提取等。\n",
    " - 尺度空间方法将传统的单尺度图像信息处理技术纳入尺度不断变化的动态分析框架中，更容易获取图像的本质特征。尺度空间中各尺度图像的模糊程度逐渐发大，能够模拟人在距离目标由近到远时目标在视网膜上的形成过程。\n",
    " \n",
    "![pic](18.png)\n",
    "下采样的间隔通常为2，x、y都是如此。\n",
    "![pic](20.png)\n",
    "尺度空间极值检测：\n",
    "![pic](21.png)\n",
    "![pic](22.png)\n",
    "![pic](19.png)\n",
    "从左到右是原始图像逐渐经过高斯模糊以及尺度空间形成的金字塔。其中某一组中的图像都是由它左边的图像进行的高斯模糊得到的。\n",
    "![pic](23.png)\n",
    "\n",
    "##### 高斯差分金字塔\n",
    "![pic](24.png)\n",
    "![pic](25.png)\n",
    "\n",
    "高斯更为高效。\n",
    "![pic](26.png)\n",
    "![pic](27.png)\n",
    "![pic](28.png)\n",
    "![pic](29.png)\n",
    "![pic](30.png)\n",
    "![pic](31.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 关键点定位\n",
    "![pic](32.png)\n",
    "真正的极值点往往在两个整数点中间的位置，所以采用差值的方式（子像素差值）。\n",
    "![pic](33.png)\n",
    "此时的数据是包括x、y以及尺度坐标。\n",
    "进行进一步筛选。\n",
    "一个定义不好的高斯差分算子DOG算子的极值在垂直边缘的地方有较大的主曲率，而在横跨边缘（切线方向）的方向有较小的主曲率。 DOG算子会产生较强的边缘响应，需要剔除不稳定的边缘响应点。获取特征点处的Hessian矩阵，主曲率通过一个2x2 的Hessian矩阵H求出：\n",
    "![pic](34.png)\n",
    "![pic](35.png)\n",
    "![pic](36.png)\n",
    "![pic](37.png)\n",
    "![pic](38.png)\n",
    "![pic](39.png)\n",
    "![pic](40.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 关键点特征描述\n",
    "![pic](41.png)\n",
    "旋转不变形是指，假设用一个特征去描述当前的特征点，当特征点旋转之后，特征表示不变。\n",
    "##### 方向直方图\n",
    "![pic](42.png)\n",
    "\n",
    "![pic](43.png)\n",
    "特征描述符的生成大致有三个步骤：\n",
    "1. 校正旋转主方向，确保旋转不变性。\n",
    "2. 生成描述子，最终形成128维的特征向量。\n",
    "3. 归一化处理，将特征向量长度进行归一化处理，进一步去除光照的影响。\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![pic](53.png)\n",
    "在新的像素格中，对应的坐标也随之发生变化。\n",
    "对旋转之后新的窗口进行特征描述。\n",
    "![pic](54.png)\n",
    "计算完每个像素点的梯度以及对应的幅值和方向后，利用高斯窗口进行加权运算。之后继续做梯度方向累积，单不计算峰值。 分成几个区域，再分别进行直方图统计。\n",
    "![pic](55.png)\n",
    "![pic](56.png)\n",
    "取0.2的截断是为了去除光照影响。\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![pic](44.png)\n",
    "\n",
    "![pic](45.png)\n",
    "\n",
    "![pic](46.png)\n",
    "\n",
    "![pic](47.png)\n",
    "\n",
    "![pic](48.png)\n",
    "\n",
    "![pic](49.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### SIFT的缺点\n",
    "![pic](50.png)\n",
    "![pic](51.png)\n",
    "后续做特征匹配能得到比较不错的结果。\n",
    "![pic](52.png)\n",
    "\n",
    "##### 总结\n",
    "1. 尺度空间的核心思想是通过不同分辨率看同一个图像，可通过不同尺度的高斯函数与原始图像卷积实现。\n",
    "2. 极大值点的精确定位可通过解含有二阶导数项的方程得到。\n",
    "3. 借助在关键点附近区域的梯度方向统计与直方图生成，SIFT最终可得到对应的每个关键点的128维向量描述。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### ORB特征检测，ORB算子原理\n",
    "![pic](57.png)\n",
    "##### oFAST特征提取\n",
    " - ORB算法的特征提取是由FAST算法改进的，这里称为oFAST（FAST keypoint Orientation）\n",
    " - 在使用FAST提取出特征点之后，给其定义一个特征点方向，以此来实现特征点的旋转不变形。\n",
    "![pic](58.png)\n",
    "以FAST-12为例，加快速度，中间先选4个位置上的值，比如先选择了12、3、6、9四个点方向，如果这四个值都大于P点或者小于P点，进一步计算中间的值是否满足条件。反之，如果四个点都不满足，那么相应的这个点就放弃视为特征点。\n",
    "这种加速会造成误选，继续进行优化。\n",
    "![pic](59.png)\n",
    "![pic](60.png)\n",
    "\n",
    "##### 处理尺度信息\n",
    "![pic](61.png)\n",
    "##### 旋转不变性\n",
    "![pic](63.png)\n",
    "![pic](62.png)\n",
    "左侧使用了非极大值抑制，右侧没有使用。角的位置成功检测出角点，但也会存在大量误检。\n",
    "![pic](64.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### rBRIEF特征描述\n",
    "ORB算法的特征描述是由BRIEF算法改进的， 这里称为rBRIEF（Rotation-Aware Brief） 。也就是说， 在BRIEF特征描述的基础上加入旋转因子从而改进BRIEF算法。\n",
    "![pic](65.png)\n",
    "![pic](66.png)\n",
    "最终描述子的长度就是选择的点对的个数，也就是N。\n",
    "这种选择描述相对于SIFT更为高效，因为虽然SIFT特征数量有限只有128，但最终是个浮点值，而这里虽然可能是256，但由于是二进制，所以有更紧凑的字节表示。\n",
    "\n",
    "##### 不同的选择点对的方法\n",
    "![pic](67.png)\n",
    "![pic](68.png)\n",
    "1. 对于第一种就是分布在各处都有。\n",
    "2. 对于第二种，明显通过中心的数目更多，因为高斯曲线越靠近零点区域越密。\n",
    "3. 对于第三种，其中一个点比较接近中心，另外一个点分布的就比较分散。\n",
    "4. 由于是通过极坐标进行了转换，所以呈现的效果比较规律。\n",
    "5. 由于一个点固定在0，其他点随机选择，所以呈发散状。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 具有旋转不变性的BRIEF\n",
    "![pic](69.png)\n",
    "![pic](70.png)\n",
    "和SIFT类似， 就是原始图像中对应的坐标经过旋转之后到了新的位置。然后使用新的坐标点对进行表示。\n",
    "###### BRIEF算法的改进\n",
    "![pic](71.png)\n",
    "表格中，横轴是每一个均值偏移0.5的大小（就是和0.5相差的数值，取值为0-0.5），纵轴表示有多少均值在0.5上。\n",
    "![pic](72.png)\n",
    "![pic](73.png)\n",
    "描述符的每一列对应二进制的一位，用黑白表示。\n",
    "得到描述符后按列进行均值计算。\n",
    "进一步选择一个最优的描述。\n",
    "![pic](74.png)\n",
    "\n",
    "##### 总结\n",
    "1. ORB = oFAST + rBRIEF\n",
    "2. oFAST是一类快速角点检测算法，并具备旋转不变性\n",
    "3. rBRIEF是一类角点描述(编码算法)， 并且编码具有良好的可区分性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
